// 引入express模块
const express = require('express');
//  获取Router
const Router=express.Router;
//创建路由器对象
const router= new Router();

//逻辑
//引入sha1加密
const sha1=require('sha1')
//引入config模块
const config=require('../config')
//引入reply模块
const reply=require('../reply')
//引入wechat模块
const Wechat=require('../wechat/wechart')
// 创建wbchat的示例对象
const wechat=new Wechat();
//引入模式对象
const Theaters=require('../model/Theaters');
const Trailers=require('../model/Trailers');
const Danmus=require('../model/Danmus');

//搜索页面路由
router.get('/search',async (req,res)=>{  //这是一个最基础的路由
    /*
    一、生成js-sdk使用的签名
    1、组合参与签名的四个参数：
    jsapi_ticket（临时票据）、noncestr（随机字符串）、timestamp（时间戳）、url（当前服务器地址）
    2、按照字典序排序、再拼接在一起，以&
    3、进行sha1加密，最终生成我们想要的 signature 签名
    */
    // 临时票据
    const {ticket}=await wechat.fetchTicket()
    console.log(ticket)
    // 随机字符串
    const noncestr=(Math.random()).toString().split('.')[1];
    console.log('noncestr:'+noncestr)
    // 时间戳  日了  这里的计算signature的时间戳 是秒
    const timestamp=parseInt( Date.now()/1000 );
    console.log('timestamp:'+timestamp)
    //url当前服务器地址
    const url=config.url;
    console.log('url:'+url+'/search')

    let arr=[
        `jsapi_ticket=${ticket}`,
        `noncestr=${noncestr}`,
        `timestamp=${timestamp}`,
        `url=${url}/search`];//还得把当前页面的地址拼上去
    let arrSort=arr.sort();
    const str=arrSort.join('&'); //  xxx=xxx&xxx=xxx&xxx=xxx
    console.log('str:'+str)
    const signature=sha1(str);  //生成的 这个signature是给 页面使用
console.log('signature:'+signature)
    //ejs技术 当用户访问这个地址的时候，我们在后台渲染完这个页面给他
    res.render('search',{ //如何传入参数 给页面使用
        signature,  //注意  这些字母必须是小写，一旦有大写就会出问题
        noncestr,
        timestamp,
        url
    });
})
//详情页面的路由
router.get('/detail/:id',async (req,res)=>{
    //获取占位符id
    let {id}=req.params;
     //判断id是否存在
    console.log(id)
    if(id){
        //去数据库中找到对应id值的所有数据。 需要查找数据 就需要引入模式对象theaters
        let data=await Theaters.findOne({doubanID:id},{_id:0,__v:0,createTime:0}); //第一个是条件 第二个是查询结果过滤 1表示查询 0表示不查询
        data.posterKeyUrl=`${config.qiniuurl}${data.posterKey}`;
        // console.log(data);
        //渲染到页面上
        res.render('detail',{data});
    }else{
        res.send('error暂时没有这个页面')
    }
})
//首页movie 页面的路由
router.get('/movie',async (req,res)=>{
    //去数据库中找到对应id值的所有数据。 需要查找数据 就需要引入模式对象theaters
    let data=await Trailers.find({},{_id:0,__v:0,cover:0,link:0,image:0}); //第一个是条件 第二个是查询结果过滤 1表示查询 0表示不查询
    data.forEach(item=>{
        item.waiwangurl=config.url;
        item.posterKeyUrl=`${config.qiniuurl}${item.posterKey}`;
    })
    let waiwangurl=config.url;
    console.log(waiwangurl);
    //渲染到页面上
    res.render('movie',{data,waiwangurl});
})
//v3 页面的路由 加载弹幕的路由
router.get('/v3',async (req,res)=>{
    // 获取用户发送过来的请求参数
    const {id}=req.query;
     // 去数据库中查找相应的电影弹幕信息
    const data = await Danmus.find({doubanID:id});
    /*
        data 是查找的对应id的电影的所有评论，最终我们要返回给用户
        res.send({
            code:0,
            data:[
                []...
            ]
        })的形式
    */
    //返回用户的resData=[]；
    let resData=[];
    data.forEach(item => {
        resData.push([
            item.time,
            item.type,
            item.color,
            item.author,
            item.text
        ])
    })
    console.log('查询的弹幕：');
    console.log(resData);
    // 返回用户响应
    res.send({
        code:0,
        data:resData
    })
})
//v3 页面的路由 接收弹幕的路由
     // 需要引入boduParse 来接收前台的post请求
    // const bodyParser=require('body-parser');
router.post('/v3', async (req,res)=>{
    // 这里的是以流式的形式返回的 所以bodyparse没用
    // const body=req.body;
    // console.log(body); //{}
    // 对于流式的数据 我们用on  data的形式
    console.log('用户发送了弹幕:');
    // 获取请求参数
    let {id,author,time,text,color,type}=await new Promise((resolve,reject)=>{
        let body='';
        req.on('data',data=>{
            // 接收的数据 类型是buffer，需要调用toString转换
            body+=data.toString();
        }).on('end',()=>{
            console.log(body)
            // 将json字符串解析成 对象
            resolve(JSON.parse(body))
        })
    })
    //保存到数据库中  保存都库中 就要先建立集合
    await Danmus.create({
        doubanID:id,
        author,
        time,
        text,
        color,
        type
    })
    // 返回响应
    res.send({
        code:0,
        data:{}
    })

})
// console.log('router')

// 语音接口 输入搜索数据库的电影名字
const bodyParser=require('body-parser');
router.post('/api/getyuyinList',bodyParser.urlencoded({extended:true}),async (req, res) => {
    console.log('POST进入了/api/getyuyinList')
    const {name}=req.body;
    const data = await Theaters.find({title:name},{title:1,summary:1,image:1,doubanID:1,posterKey:1,_id:0})
    console.log(data)
    res.json(data)
})
router.get('/api/getyuyinList/:name',async (req, res) => {
    console.log('GET进入了/api/getyuyinList')
    const {name}=req.params;
    const data = await Theaters.find({title:name},{title:1,summary:1,image:1,doubanID:1,posterKey:1,_id:0})
    console.log(data)
    res.json(data)
})


//验证服务器的有效性
router.use(reply())


//暴露出去
module.exports=router;